iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
自我挑戰組

利用 node.js/express 架設網站系列 第 8

Day-08 express API開發(下)

  • 分享至 

  • xImage
  •  

今天延續上次的API,要繼續了解API
1.API測試
2.API驗證與錯誤處理
3.API安全性與性能優化

API測試

API 測試是確保你的 API 在各種情況下都能正常運作的關鍵步驟。可以使用兩種方式來測試你的 API:
1.使用 Postman 或 cURL 進行手動測試
2.使用 Mocha 和 Chai 進行自動化測試

  • Postman&cURL:
    Postman昨天有使用過,就不多做介紹;cURL是是一個命令行工具,可以使用它來發送 HTTP 請求。例如:
# 發送 GET 請求
curl -X GET http://localhost:3000/users

# 發送 POST 請求
curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"name": "New User"}'
  • Mocha&Chai:
    自動化測試可以讓你在每次修改代碼後快速檢查 API 是否仍然正常工作。Mocha 是一個測試框架,Chai 則提供了簡潔的斷言庫,用於編寫測試斷言。
    首先安裝Mocha&Chai:
npm install mocha chai supertest --save-dev

接著先撰寫一個測試用的程式碼:

const request = require('supertest');
const expect = require('chai').expect;
const app = require('../app'); // 引入你的 Express 應用

describe('GET /users', () => {
    it('should return an array of users', (done) => {
        request(app)
            .get('/users')
            .expect(200)
            .end((err, res) => {
                if (err) return done(err);
                expect(res.body).to.be.an('array');
                done();
            });
    });
});

describe('POST /users', () => {
    it('should create a new user', (done) => {
        request(app)
            .post('/users')
            .send({ name: 'New User' })
            .expect(201)
            .end((err, res) => {
                if (err) return done(err);
                expect(res.body.name).to.equal('New User');
                done();
            });
    });
});

通過這樣的測試,你可以自動檢測 API 是否能夠正常處理各種請求,並檢查返回的結果是否符合預期。

API 驗證與錯誤處理

在開發 API 時,必須對請求的數據進行驗證,以確保數據的有效性。接下來,我將學習如何在 Express 中處理這部分內容。

  • 數據驗證
    1.安裝 express-validator:
npm install express-validator

2.驗證請求數據:

const { body, validationResult } = require('express-validator');

app.post('/users',
    body('name').isString().notEmpty(),
    (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }
        const newUser = { id: users.length + 1, name: req.body.name };
        users.push(newUser);
        res.status(201).json(newUser);
    });

這程式碼會驗證 name 是否為非空字符串,並在驗證失敗時返回 400 錯誤。

  • 錯誤處理
    為了提高用戶體驗和易於調試,應該在 API 中實現完善的錯誤處理機制。我們可以在 Express 中使用錯誤中介軟體來捕捉和處理錯誤。
    範例:
// 捕捉未處理的路由
app.use((req, res, next) => {
    res.status(404).send('Sorry, cannot find that!');
});

// 全局錯誤處理器
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something went wrong!');
});
  • API 安全性與性能優化:
    1.API 安全性:
    • 防止 SQL 注入:如果你使用 SQL 數據庫,確保使用參數化查詢(如 SQLite 或 MySQL 的預備語句)來防止 SQL 注入攻擊。
    • 使用 Helmet:Helmet 是一組 Express 中介軟體,用來幫助安全地設置 HTTP 標頭,保護應用免受一些常見的網路攻擊。
      • 安裝Helmet:
      npm install helmet
      
      • 使用Helmet:
      const helmet = require('helmet');
      app.use(helmet());
      
    • 防止 CSRF 攻擊:可以使用 csurf 模塊來防止跨站請求偽造(CSRF)攻擊。
      2.API 性能優化:
    • 使用日誌記錄:使用 morgan 來記錄 API 請求,這樣可以在性能調試中更清楚地了解 API 的訪問情況。
      • 安裝 morgan:
      npm install morgan
      
      • 使用 morgan:
      const morgan = require('morgan');
      app.use(morgan('combined')); // 使用「combined」模式來記錄詳細日誌
      
    • 使用限流:防止 DDoS 攻擊或惡意請求洪流,使用 express-rate-limit 來限制 API 的請求數量。
      • 安裝 express-rate-limit:
      npm install express-rate-limit
      
      • 設置限流:
      const rateLimit = require('express-rate-limit');
      
      const apiLimiter = rateLimit({
          windowMs: 15 * 60 * 1000, // 15 分鐘
          max: 100 // 每個 IP 最多 100 次請求
      });
      
      app.use('/api/', apiLimiter); // 為所有 /api/ 路由設置限流
      

上一篇
Day-07 express API開發(上)
下一篇
Day-09 資料庫整合與進階查詢操作
系列文
利用 node.js/express 架設網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言